<?php declare(strict_types=1);
/**
 * @author      xianganyall <xianganyall@gmail.com>
 * @copyright   2023-2025 owner
 **/

namespace Srv\Libs\Tools;

class ShellPrint
{
    public const COLOR_DEFAULT          = '';           // 默认
    public const COLOR_BLACK            = 'black';      // 黑色
    public const COLOR_RED              = 'red';        // 红色
    public const COLOR_GREEN            = 'green';      // 绿色
    public const COLOR_YELLOW           = 'yellow';     // 黄色
    public const COLOR_BLUE             = 'blue';       // 蓝色
    public const COLOR_PURPLE           = 'purple';     // 紫色
    public const COLOR_CYAN             = 'cyan';       // 青色
    public const COLOR_WHITE            = 'white';      // 白色
    public const STYLE_NORMAL           = '';           // 常规
    public const STYLE_BLOB             = 'b';          // 加粗
    public const STYLE_UNDERLINE        = '_';          // 下划线
    public const STYLE_FLASHING         = 's';          // 闪烁
    public const STYLE_REVERSE          = 'f';          // 反显
    public const STYLE_BLANKING         = 'x';          // 隐藏

    /**
     * @param string $string
     * @param string $color
     * @param string $style
     * @param string $bgColor
     * @param bool   $isDefault
     * @return string
     * 获取打印信息
     */
    public static function getPrintString(string $string, string $color = self::COLOR_DEFAULT, string $style = self::STYLE_NORMAL, string $bgColor = self::COLOR_DEFAULT, bool $isDefault = false):string
    {
        return self::getPrintColorStyle($color, $style, $bgColor).$string.($isDefault ? self::getPrintDefaultColorStyle() : '');
    }

    /**
     * 直接打印清空
     */
    public static function clear()
    {
        echo self::getPrintClearColorStyle();
    }

    /**
     * @param string $string
     * @param string $color
     * @param string $style
     * @param string $bgColor
     * @param bool   $isClear
     * 直接打印信息
     */
    public static function printString(string $string, string $color = self::COLOR_DEFAULT, string $style = self::STYLE_NORMAL, string $bgColor = self::COLOR_DEFAULT, bool $isClear = false)
    {
        $isClear && self::clear();
        echo self::getPrintColorStyle($color, $style, $bgColor).$string.self::getPrintDefaultColorStyle();
    }

    /**
     * @param string $string
     * @param string $color
     * @param string $style
     * @param string $bgColor
     * @param bool   $isClear
     * 直接打印信息并换行
     */
    public static function printlnString(string $string, string $color = self::COLOR_DEFAULT, string $style = self::STYLE_NORMAL, string $bgColor = self::COLOR_DEFAULT, bool $isClear = false)
    {
        self::printString($string, $color, $style, $bgColor, $isClear);
        echo "\n";
    }

    /**
     * @param string $string
     * 获取打印成功信息
     */
    public static function printSuccessString(string $string)
    {
        echo self::getPrintColorStyle(self::COLOR_GREEN, self::STYLE_NORMAL, self::COLOR_DEFAULT).$string.self::getPrintDefaultColorStyle();
    }

    /**
     * @param string $string
     * 获取打印失败信息
     */
    public static function printFailedString(string $string)
    {
        echo self::getPrintColorStyle(self::COLOR_RED, self::STYLE_NORMAL, self::COLOR_DEFAULT).$string.self::getPrintDefaultColorStyle();
    }

    /**
     * @param string $string
     * 获取打印错误信息
     */
    public static function printErrorString(string $string)
    {
        echo self::getPrintColorStyle(self::COLOR_RED, self::STYLE_BLOB, self::COLOR_DEFAULT).$string.self::getPrintDefaultColorStyle();
    }

    /**
     * @param string $string
     * 获取打印告警信息
     */
    public static function printWarningString(string $string)
    {
        echo self::getPrintColorStyle(self::COLOR_YELLOW, self::STYLE_NORMAL, self::COLOR_DEFAULT).$string.self::getPrintDefaultColorStyle();
    }

    /**
     * @param string $color
     * @param string $style
     * @param string $bgColor
     * @return string
     * 获取打印字符的样式和颜色
     */
    public static function getPrintColorStyle(string $color, string $style, string $bgColor):string
    {
        $colorChar          = self::getPrintColor($color);
        $bgColorChar        = self::getPrintColor($bgColor);
        $styleChar          = self::getPrintStyle($style);
        $colorStyle         = '';
        if(strlen($style) > 0) $colorStyle .= (strlen($colorStyle) < 1 ? '' : ';').$styleChar;
        if(strlen($color) > 0) $colorStyle .= (strlen($colorStyle) < 1 ? '' : ';').'3'.$colorChar;
        if(strlen($bgColor) > 0) $colorStyle .= (strlen($colorStyle) < 1 ? '' : ';').'4'.$bgColorChar;
        $colorStyle         = (strlen($colorStyle) < 1 ? '0' : $colorStyle).'m';
        return "\033[".$colorStyle;
    }

    /**
     * @param string $color
     * @return string
     * 获取打印字体颜色
     */
    private static function getPrintColor(string $color):string
    {
        switch($color){
            case self::COLOR_BLACK:   { $result = '0'; break; }   // 黑色
            case self::COLOR_RED:     { $result = '1'; break; }   // 红色
            case self::COLOR_GREEN:   { $result = '2'; break; }   // 绿色
            case self::COLOR_YELLOW:  { $result = '3'; break; }   // 黄色
            case self::COLOR_BLUE:    { $result = '4'; break; }   // 蓝色
            case self::COLOR_PURPLE:  { $result = '5'; break; }   // 紫色
            case self::COLOR_CYAN:    { $result = '6'; break; }   // 青色
            case self::COLOR_WHITE:   { $result = '7'; break; }   // 白色
            default:{ $result = '0'; }
        }
        return $result;
    }

    /**
     * @param string $style
     * @return string
     * 获取打印字体样式
     */
    private static function getPrintStyle(string $style):string
    {
        $result     = '0';
        switch($style){
            case self::STYLE_BLOB:      { $result = '1'; break; }   // 加粗
            case self::STYLE_UNDERLINE: { $result = '4'; break; }   // 下划线
            case self::STYLE_FLASHING:  { $result = '5'; break; }   // 闪烁
            case self::STYLE_REVERSE:   { $result = '7'; break; }   // 反显
            case self::STYLE_BLANKING:  { $result = '8'; break; }   // 隐藏
        }
        return $result;
    }

    /**
     * @return string
     * 获取归零样式
     */
    private static function getPrintDefaultColorStyle():string
    {
        return "\033[0m";
    }

    /**
     * @return string
     * 获取清空屏幕
     */
    private static function getPrintClearColorStyle():string
    {
        return "\033[2J\033[0;0H";
    }
}